#include "tableau_arme.h"
#include <iostream>
#include <stdlib.h>
#include "assert.h"
using namespace std;

tableau_arme* creerTabArme(const char filename[])
{
    FILE* f;
    tableau_arme* Ta;
    int tot,num,totP,i; ///@param tot entier est le nombre total d'arme,@param num entier est le numero de l'arme et @param totP entier est la taille total du tableau
    int degat,debloque;///@param degat et @param debloque sont differentes information pour l'arme
    bool deb; ///@param deb booleen pour le bloquage de l'arme
    char chaine[20];

    f=fopen(filename,"r");///on ouvre le fichier
    if(f==NULL)	///puis on fait le test usuel de l'ouverture du fichier
              {
                         printf("ERREUR dans l'ouverture du fichier");
                         assert(f);	///on arrete la fonction si erreur
              }

    fgets(chaine,20,f);	///on saute la premiere ligne
    fscanf(f,"%d\n%d\n",&totP,&tot);///on recupere tot et num
    Ta = new tableau_arme[totP];///on alloue la place du tableau
    tabArmeSetNbArme(Ta,tot);///on initialise le nombre d'arme
    tabArmeSetNbPos(Ta,totP);///et la taille total du tableau
    for( i=0; i<tot; i++ )///pour chaque arme
    {
        fscanf(f,"%d\n%d\n%d\n",&num,&degat,&debloque);///on recupere les info arme
        if(debloque == 1) {deb = true;} else {deb = false;}///et avec on initialise l'arme
        tabArmeSetArme(&(Ta[i]),creerArme(num,degat,deb));
    }

    fclose(f);	///puis on ferme le fichier
    return Ta;
}

void supprimeTabArme(tableau_arme * Ta)
{
    int i;
    for( i=0;i<tabArmeGetNbArme(Ta);i++ )///pour chaque element dans le tableau
    {
        supprimeArme(Ta[i].a);///on supprime l'arme
    }
    delete[] Ta;///pui son libere le tableau
}

void afficheTabArme(tableau_arme * Ta)
{
    int i;
    for(i=0;i<tabArmeGetNbArme(Ta);i++)///pour chaque element dans le tableau
    {
        afficheArme(Ta[i].a);///on affiche une arme par ligne
        cout<<endl;
    }
}

arme* tabArmeGetArme(tableau_arme * Ta)
{
    return Ta->a;
}

int tabArmeGetNbPos(tableau_arme * Ta)
{
    return Ta->nb_arme_possible;
}

int tabArmeGetNbArme(tableau_arme * Ta)
{
    return Ta->nb_arme;
}

void tabArmeSetArme(tableau_arme * Ta, arme * a)
{
    Ta->a = a;
}

void tabArmeSetNbPos(tableau_arme * Ta, int nb_pos)
{
    Ta->nb_arme_possible = nb_pos;
}

void tabArmeSetNbArme(tableau_arme * Ta, int nb)
{
    Ta->nb_arme = nb;
}

void ajoutArme(tableau_arme * Ta, arme * a)
{
    int i;
    tableau_arme* temp;
    if(tabArmeGetNbArme(Ta) == tabArmeGetNbPos(Ta)) ///si le tableau est complet
    {
        temp = new tableau_arme[2*Ta->nb_arme_possible]; ///on cree un tableau 2 fois plus grand
        for( i=0;i<tabArmeGetNbArme(Ta);i++ )
        {
            temp[i].a= tabArmeGetArme(&(Ta[i])); ///puis on copie l'ancien tableau
        }
        delete(tabArmeGetArme(Ta)); ///et on le supprime
        Ta = temp;
        tabArmeSetNbPos(Ta,2*Ta->nb_arme_possible);///on actualise la taille max du tableau
    }
    tabArmeSetNbArme(Ta,Ta->nb_arme++);///et le nombre actuel d'arme possédé
    tabArmeSetArme(&(Ta[Ta->nb_arme]),a); ///enfin on ajoute l'arme
}

void tabArmeSupprime(tableau_arme * Ta, int id)
{
    int i;
    arme* temp;
    i=0;
    temp = tabArmeGetArme(&(Ta[i]));///on récupère l'arme en question
    while(armeGetId(temp) != id && i<tabArmeGetNbArme(Ta))
    {
                            i++;
                            temp = tabArmeGetArme(&(Ta[i])); /// on passe la partie du tableau qui ne va pas changer
    }
    if(armeGetId(temp) == id)/// on verifie que la boucle c'est arreter car on a trouvé l'arme
    {
                        while(i+1<tabArmeGetNbArme(Ta))
                        {
                                                Ta[i] = Ta[i+1]; /// on decale le reste du tableau d'une case vers la gauche.
                                                i++;
                        }
                        tabArmeSetNbArme(Ta,(Ta->nb_arme)--);
     }
     //reduction du tableau si besoin
}

arme* rechercheArme(tableau_arme * Ta, int id)
{
    int i;
    arme* temp;
    for( i=0; i<=tabArmeGetNbArme(Ta); i++ )
    {
        temp = tabArmeGetArme(&(Ta[i])); ///on recupère l'arme
        if(armeGetId(temp) == id){ return tabArmeGetArme(&(Ta[i])); } ///et on la compare avec l'argument
    }
    return NULL;
}

void debloqueArme(tableau_arme* Ta)
{
	int i;
	bool ok;
	i=0;
	ok=true;
	while(i<tabArmeGetNbArme(Ta) && ok==true)
	{
		if(armeGetDebloque(Ta[i].a)==1)
		{
			i++;
		}
		else
		{
			armeSetDebloque(Ta[i].a,1);
			ok=false;
		}
	}
}
